package demo2

import (
	"encoding/json"
	"fmt"
)

/*
	使用匿名结构体解析JSON数据
	1. Go语言对于 JSON 标准格式的编码和解码都有良好的支持，
		由标准库中的 encoding/json、encoding/xml、encoding/asn1 等包提供支持
	2. 反斜杠转义特性方面，JSON 使用的是 \Uhhhh 转义数字来表示一个 UTF-16 编码，而不是 Go语言的 rune 类型。
*/

// 定义手机屏幕
type screen struct {
	size       float32 // 屏幕尺寸
	resX, resY int     // 屏幕水平和处置分辨率
}

// 定义电池
type battery struct {
	capacity int // 容量
}

// 生成 json 数据
func genJSONData() []byte {
	// 完整数据结构: 匿名结构体
	raw := &struct {
		screen
		battery
		hasTouchID bool // 序列化时添加的字段：是否有指纹识别
	}{
		// 屏幕参数
		screen: screen{
			size: 5.5,
			resX: 1920,
			resY: 1080,
		},

		// 电池参数
		battery: battery{
			2910,
		},

		// 是否有指纹识别
		hasTouchID: true,
	}

	// 将数据序列化为 json
	jsonData, _ := json.Marshal(raw)

	return jsonData
}

// TestDemo218 使用匿名结构体解析JSON数据
func TestDemo218() {
	// 生成一段 json 数据
	jsonData := genJSONData()

	fmt.Println(string(jsonData))

	// 只需要屏幕和指纹识别信息的结构和实例
	screenAndTouch := struct {
		screen
		hasTouchID bool
	}{}

	// 反序列化到 screenAndTouch
	json.Unmarshal(jsonData, &screenAndTouch)

	// 输出 screenAndTouch 的详细结构
	fmt.Printf("%+v\n", screenAndTouch)

	// 只需要电池和指纹识别信息的结构和实例
	batteryAndTouch := struct {
		battery
		hasTouchID bool
	}{}

	// 反序列化到 batteryAndTouch
	json.Unmarshal(jsonData, &batteryAndTouch)

	// 输出 batteryAndTouch
	fmt.Printf("%+v\n", batteryAndTouch)
}
